library(readr)library(readxl)library(pxmake) # to load PX fileslibrary(pxR) # to load PX fileslibrary(jsonlite) # to load JSON fileslibrary(purrr)library(writexl) # Write Excel fileslibrary(dplyr)library(tidyverse)library(ggplot2) # Diagramslibrary(ggforce) # Diagramslibrary(DT) # datatable()library(DescTools)
2 Functions
Code anzeigen
### ########################################################## Duplikate in df finden & als $unique oder $duplicates selektionierbar machenfind_and_remove_duplicates <-function(df) {list(unique = df[!duplicated(df), ],duplicates = df[duplicated(df) |duplicated(df, fromLast =TRUE), ] )}### ########################################################## Aktive National- & Ständeräte identifizieren und selektionierbar machenfilter_active <-function(data, von, bis) { von <-as.Date(von) bis <-as.Date(bis) data %>%filter( DateJoining <= bis, # Eintritt vor/am Ende d. Zeitraumsis.na(DateLeaving) | DateLeaving >= von # Kein Austritt/nach Beginn des Z.. )}### ##########################################################
3ETL: Extract, Transform, Load
Daten werden aus verschiedenen Excel-Dateien ausgelesen, unabhängig davon, wie komplex oder verschachtelt sie sind (z. B. mehrere Sheets, verbundene Zellen, unterteilte Datenblöcke).
Bei Excel-Dateien mit mehreren Sheets werden Functions angewendet.
Header werden identifiziert und ggf. aus mehreren Zeilen zusammengesetzt.
Daten werden bereinigt, normalisiert und in das gewünschte Zielformat gebracht (z. B. Wide zu Long, Entfernen von Leerzeilen, Auflösen von verbundenen Zellen, Vereinheitlichung der Spaltenstruktur).
Die transformierten Daten werden für die weitere Analyse und Visualisation zu Verfügung gestellt.
3.1 Abstimmungen
Code anzeigen
# Manuell migrierte Lookup Tabellen aus dem PDF-Codebook (swissvotes.ch) laden# Parteienlookups_codebook_parties <-read_excel("lookups_codebook.xlsx",sheet ="parties")# Parteiparolenlookups_codebook_paroles <-read_excel("lookups_codebook.xlsx",sheet ="paroles")### ########################################################## Ergbenisse der Schweizweite Abstimmungen ladenvoting_raw <-read_delim("~/CAS/Zertifikatsarbeit/data/votes/abstimmungen_swissvotes_DATASET CSV 09-02-2025.csv",delim =";",escape_double =FALSE,trim_ws =TRUE,show_col_types =FALSE)# Datum formatierenvoting_raw <- voting_raw %>%mutate(datum =dmy(datum))# Einträge vor 2020 löschenvoting_5y <- voting_raw %>%filter(datum >=as.Date("2020-01-01"))# Abstimmungsdaten der letzten 5 Jahre in Vektor schreiben für spätere Selektionvoting_5y_dates <- voting_5y %>%select(datum) %>%distinct() %>%pull(datum) %>%as.character()# Abstimmungen ab 2020 in datatable() anzeigendatatable(voting_5y,class ='nowrap',filter ='top',options =list(pageLength =7,scrollX =TRUE,search =list(regex =TRUE,caseInsensitive =TRUE)))
Code anzeigen
### ########################################################## Parteien aus Parolen (p- & pdev-..-..) zwecks Lookup/Vereinheitlichung in df schreibenlookup_voting_parties_label <-bind_rows(# Block 1: Staatsebene - Mutterparteien, Verbände & weitere Organisationentibble(party_orig_value =grep("^p-",names(voting_5y),value =TRUE)) %>%mutate(level ="state") %>%separate( party_orig_value,into =c("prefix", "short_name", "add_info"),sep ="[-_]",remove =FALSE,extra ="merge",fill ="right"),# Block 2: Kantonsebene - Jungparteien, Frauensektionen, etc.tibble(party_orig_value =grep("^pdev-",names(voting_5y),value =TRUE)) %>%mutate(level ="canton_fraction") %>%separate( party_orig_value,into =c("prefix", "short_name", "add_info"),sep ="[-_]",remove =FALSE,extra ="merge",fill ="right")) %>%# Großschreibung der short_name-Spaltemutate(short_name =toupper(short_name),long_name =NA_character_,source ="Abstimmungen") %>%select(party_orig_value, short_name, long_name, prefix, add_info, level, source)### ########################################################## Relevante Felder selektionierenvoting_5y %>%select(anr, datum, titel_kurz_d, titel_off_d, rechtsform, #1 Obligatorisches Referendum#2 Fakultatives Referendum#3 Volksinitiative#4 Direkter Gegenentwurf zu einer Volksinitiative#5 Stichfrage dep,`br-pos`, #1 Befürwortend#2 Ablehnend#3 Keine#8 Vorzug für den Gegenentwurf (bei Stichfragen)#9 Vorzug für die Volksinitiative (bei Stichfragen)#. Missing legisjahr,`pa-iv`,`bv-pos`, #1 Befürwortend#2 Ablehnend#3 Keine Abstimmungsempfehlung des Parlaments#8 Vorzug für den Gegenentwurf (bei Stichfragen)`nr-pos`, #1 Befürwortende Mehrheit im Nationalrat#2 Ablehnende Mehrheit im Nationalrat#3 Keine Abstimmungsempfehlung des Nationalrats#8 Vorzug für den Gegenentwurf (bei Stichfragen) nrja, nrnein,`sr-pos`, #1 Befürwortende Mehrheit im Ständerat#2 Ablehnende Mehrheit im Ständerat#3 Keine Abstimmungsempfehlung des Ständerats#8 Vorzug für den Gegenentwurf (bei Stichfragen) srja, srnein,# Parteiparolenstarts_with("p-"),#1 Ja-Parole#2 Nein-Parole#3 keine Parole abzugeben#4 empfahl, einen leeren Stimmzettel einzulegen#5 Stimmfreigabe#8 Bevorzugung des Gegenentwurfs (bei Stichfrage)#9 Bevorzugung der Volksinitiative (bei Stichfrage)#66 Neutral: keine Parole oder Empfehlung auf leer einlegen #9999 Organisation existiert nicht#. Unbekannt# Parteiparolen Kanton / Parteisektionstarts_with("p-dev-"),#1 Ja-Parole#2 Nein-Parole#3 keine Parole abzugeben#4 empfahl, einen leeren Stimmzettel einzulegen#5 Stimmfreigabe#8 Bevorzugung des Gegenentwurfs (bei Stichfrage)#9 Bevorzugung der Volksinitiative (bei Stichfrage)# [leer] Parole gleich wie Mutterpartei (oder unbekannt) volk, #0 Eine Mehrheit der Abstimmenden hat die Vorlage abgelehnt#1 Eine Mehrheit der Abstimmenden hat die Vorlage angenommen#8 Bei Stichfragen: Mehrheit für Gegenentwurfs#9 Bei Stichfragen: Mehrheit Volksinitiative stand,#0 Die Vorlage hat keine Mehrheit der Standesstimmen er-reicht#1 Die Vorlage hat die Mehrheit der Standesstimmen erreicht#3 Ständemehr nicht notwendig#8 Bei Stichfragen: Mehrheit für Gegenentwurf#9 Bei Stichfragen: Mehrheit für Volksinitiative annahme, #0 Ablehnung der Vorlage#1 Annahme der Vorlage#8 Bei Stichfragen: Gegenentwurf angenommen#9 Bei Stichfragen: Volksinitiative angenommen#. Bei Stichfragen: Ergebnis der Stichfrage obsolet berecht, stimmen, bet, leer, ungultig, gultig, volkja, volknein,`volkja-proz`)
3.2.1.3 National- & Ständerat kombinieren für weitere Bearbeitung
Code anzeigen
# National- und Ständeratlisten kombinierenelec_nr_sr_combined <-bind_rows( elec_nationalrat_final %>%mutate(role ="Nationalrat"), elec_ständerat_final %>%mutate(role ="Ständerat")) %>%select(role, everything())# Abstiummungsdatum (voting_5y_dates) als Spalten hinzufügenelec_nr_sr_combined <- elec_nr_sr_combined %>%mutate(!!!setNames(rep(list(NA_integer_),length(voting_5y_dates)), voting_5y_dates))# Ergänzen ob Ratsmitglied zum Zeitpunkt der Abstimmung aktiv warelec_nr_sr_combined <- elec_nr_sr_combined %>%mutate(!!!setNames(lapply(voting_5y_dates,function(datum) { abstimmungsdatum <-as.Date(datum)with(., as.integer( # 1 der 0 zurück DateJoining <= abstimmungsdatum & (is.na(DateLeaving) | DateLeaving >= abstimmungsdatum)))} ), voting_5y_dates))### ########################################################## Kanton- und Parteibezeichnungen zwecks Lookup/Vereinheitlichung in df schreiben lookup_elec_nr_sr_combined_canton_label <- elec_nr_sr_combined %>%select(CantonAbbreviation, CantonName) %>%distinct()lookup_elec_nr_sr_combined_parties_label <- elec_nr_sr_combined %>%select(PartyAbbreviation, PartyName) %>%distinct() %>%rename(party_orig_value = PartyAbbreviation,long_name = PartyName) %>%mutate(prefix =NA_character_,add_info =NA,level =NA_character_,source ="National_und_Ständerat",short_name = party_orig_value %>%str_replace("-.*", "") %>%# ab dem ersten "-" abschneidenstr_replace("^M-E$", "Mitte") %>%# "M-E" durch "Mitte" ersetzentoupper())%>%select(party_orig_value, short_name, long_name, prefix, add_info, level, source)
3.2.2 Kantonsebene
3.2.2.1 Kantonale Regierung (Exekutive)
Die Kantonalen Abstimmungen finden nicht in allen kantonen gleichzeitg statt. Deshalb genauer die Räte/Konstellation zum Zeitpunkt der jeweiligen Abstimmung zu prüfen.
Die Struktur der “schön formatierten” Exceldatei lässt keinen “simplen” Import zu.
1 Excelsheet / Jahr
Header ist in Zeile 2 und nicht vollständig
Daten (für Kantone) starten in Zeile 4 aber enden auf Zeile 29 bevor es mit Kommentaren und Fussnoten weitergeht.
# Objekt erstellen, mit Sheets als tibble/dataframedaten_liste <-setNames(lapply(selected_sheets,function(sheet) import_election_data (dateipfad, sheet)), selected_sheets)str(daten_liste)
List of 6
$ 2024: tibble [494 × 4] (S3: tbl_df/tbl/data.frame)
..$ Kanton : chr [1:494] "Zürich" "Zürich" "Zürich" "Zürich" ...
..$ Wahljahr: num [1:494] 2023 2023 2023 2023 2023 ...
..$ Partei : chr [1:494] "FDP 2" "SP" "SVP" "LP 2" ...
..$ Wert : num [1:494] 1 1 2 NA 0 NA 0 1 NA NA ...
$ 2023: tibble [494 × 4] (S3: tbl_df/tbl/data.frame)
..$ Kanton : chr [1:494] "Zürich" "Zürich" "Zürich" "Zürich" ...
..$ Wahljahr: num [1:494] 2023 2023 2023 2023 2023 ...
..$ Partei : chr [1:494] "FDP 2)" "SP" "SVP" "LP 2)" ...
..$ Wert : num [1:494] 1 1 2 NA 0 NA 0 1 NA NA ...
$ 2022: tibble [494 × 4] (S3: tbl_df/tbl/data.frame)
..$ Kanton : chr [1:494] "Zürich" "Zürich" "Zürich" "Zürich" ...
..$ Wahljahr: num [1:494] 2019 2019 2019 2019 2019 ...
..$ Partei : chr [1:494] "FDP 2)" "SP" "SVP" "LP 2)" ...
..$ Wert : num [1:494] 1 1 2 NA 0 NA NA NA 1 0 ...
$ 2021: tibble [494 × 4] (S3: tbl_df/tbl/data.frame)
..$ Kanton : chr [1:494] "Zürich" "Zürich" "Zürich" "Zürich" ...
..$ Wahljahr: num [1:494] 2019 2019 2019 2019 2019 ...
..$ Partei : chr [1:494] "FDP 2)" "SP" "SVP" "LP 2)" ...
..$ Wert : num [1:494] 1 1 2 NA 0 NA NA NA 1 0 ...
$ 2020: tibble [780 × 4] (S3: tbl_df/tbl/data.frame)
..$ Kanton : chr [1:780] "Zürich" "Zürich" "Zürich" "Zürich" ...
..$ Wahljahr: num [1:780] 2019 2019 2019 2019 2019 ...
..$ Partei : chr [1:780] "FDP 2)" "CVP 3)" "SP" "SVP" ...
..$ Wert : num [1:780] 1 1 1 2 NA NA NA 0 NA NA ...
$ 2019: tibble [780 × 4] (S3: tbl_df/tbl/data.frame)
..$ Kanton : chr [1:780] "Zürich" "Zürich" "Zürich" "Zürich" ...
..$ Wahljahr: num [1:780] 2019 2019 2019 2019 2019 ...
..$ Partei : chr [1:780] "FDP 2)" "CVP 3)" "SP" "SVP" ...
..$ Wert : num [1:780] 1 1 2 2 NA NA NA 0 NA NA ...
Code anzeigen
lapply(daten_liste, summary)
$`2024`
Kanton Wahljahr Partei Wert
Length:494 Min. :2020 Length:494 Min. :0.000
Class :character 1st Qu.:2022 Class :character 1st Qu.:0.000
Mode :character Median :2023 Mode :character Median :1.000
Mean :2023 Mean :1.613
3rd Qu.:2024 3rd Qu.:2.000
Max. :2024 Max. :7.000
NA's :303
$`2023`
Kanton Wahljahr Partei Wert
Length:494 Min. :2020 Length:494 Min. :0.000
Class :character 1st Qu.:2020 Class :character 1st Qu.:0.000
Mode :character Median :2022 Mode :character Median :1.000
Mean :2022 Mean :1.647
3rd Qu.:2023 3rd Qu.:2.000
Max. :2023 Max. :7.000
NA's :307
$`2022`
Kanton Wahljahr Partei Wert
Length:494 Min. :2018 Length:494 Min. :0.000
Class :character 1st Qu.:2020 Class :character 1st Qu.:0.000
Mode :character Median :2020 Mode :character Median :1.000
Mean :2020 Mean :1.613
3rd Qu.:2022 3rd Qu.:2.000
Max. :2022 Max. :7.000
NA's :303
$`2021`
Kanton Wahljahr Partei Wert
Length:494 Min. :2017 Length:494 Min. :0.000
Class :character 1st Qu.:2018 Class :character 1st Qu.:0.000
Mode :character Median :2020 Mode :character Median :1.000
Mean :2019 Mean :1.613
3rd Qu.:2020 3rd Qu.:2.000
Max. :2021 Max. :7.000
NA's :303
$`2020`
Kanton Wahljahr Partei Wert
Length:780 Min. :2016 Length:780 Min. :0.000
Class :character 1st Qu.:2018 Class :character 1st Qu.:0.000
Mode :character Median :2019 Mode :character Median :1.000
Mean :2019 Mean :1.604
3rd Qu.:2020 3rd Qu.:2.000
Max. :2020 Max. :7.000
NA's :588
$`2019`
Kanton Wahljahr Partei Wert
Length:780 Min. :2015 Length:780 Min. :0.000
Class :character 1st Qu.:2016 Class :character 1st Qu.:0.000
Mode :character Median :2018 Mode :character Median :1.000
Mean :2017 Mean :1.596
3rd Qu.:2018 3rd Qu.:2.000
Max. :2019 Max. :7.000
NA's :587
Code anzeigen
# Alle tibbles zu einem Dataframe zusammenfügenelec_kantonale_regierung_combined <-bind_rows(daten_liste,.id ="Sheet")# Parteinamenvariantenunique(elec_kantonale_regierung_combined$Partei)
# Objekt erstellen, mit Sheets als tibble/dataframedaten_liste <-setNames(lapply(selected_sheets,function(sheet) importiere_sheet(dateipfad, sheet)), selected_sheets)str(daten_liste)
List of 6
$ 2024: tibble [7,515 × 10] (S3: tbl_df/tbl/data.frame)
..$ Kantons-Nr. : chr [1:7515] "1" "1" "1" "1" ...
..$ Kanton : chr [1:7515] "ZH" "ZH" "ZH" "ZH" ...
..$ Gemeinde-Nr. : num [1:7515] 230 230 230 230 230 230 230 230 230 230 ...
..$ Gemeinde : chr [1:7515] "Winterthur" "Winterthur" "Winterthur" "Winterthur" ...
..$ Wahljahr : num [1:7515] 2022 2022 2022 2022 2022 ...
..$ Einwohner : num [1:7515] 115129 115129 115129 115129 115129 ...
..$ Gemeindegrösse_Cluster: chr [1:7515] "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" ...
..$ Partei : chr [1:7515] "FDP 1" "FDP 1" "FDP 1" "Die Mitte 2" ...
..$ m_w_Total : chr [1:7515] "Frauen" "Männer" "Total" "Frauen" ...
..$ Wert : num [1:7515] 0 1 1 0 1 1 NA NA NA 1 ...
$ 2023: tibble [7,776 × 10] (S3: tbl_df/tbl/data.frame)
..$ Kantons-Nr. : chr [1:7776] "1" "1" "1" "1" ...
..$ Kanton : chr [1:7776] "ZH" "ZH" "ZH" "ZH" ...
..$ Gemeinde-Nr. : num [1:7776] 230 230 230 230 230 230 230 230 230 230 ...
..$ Gemeinde : chr [1:7776] "Winterthur" "Winterthur" "Winterthur" "Winterthur" ...
..$ Wahljahr : num [1:7776] 2022 2022 2022 2022 2022 ...
..$ Einwohner : num [1:7776] 115129 115129 115129 115129 115129 ...
..$ Gemeindegrösse_Cluster: chr [1:7776] "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" ...
..$ Partei : chr [1:7776] "FDP 1" "FDP 1" "FDP 1" "Die Mitte 2" ...
..$ m_w_Total : chr [1:7776] "Frauen" "Männer" "Total" "Frauen" ...
..$ Wert : num [1:7776] 0 1 1 0 1 1 NA NA NA 1 ...
$ 2022: tibble [7,776 × 10] (S3: tbl_df/tbl/data.frame)
..$ Kantons-Nr. : chr [1:7776] "1" "1" "1" "1" ...
..$ Kanton : chr [1:7776] "ZH" "ZH" "ZH" "ZH" ...
..$ Gemeinde-Nr. : num [1:7776] 230 230 230 230 230 230 230 230 230 230 ...
..$ Gemeinde : chr [1:7776] "Winterthur" "Winterthur" "Winterthur" "Winterthur" ...
..$ Wahljahr : num [1:7776] 2022 2022 2022 2022 2022 ...
..$ Einwohner : num [1:7776] 115129 115129 115129 115129 115129 ...
..$ Gemeindegrösse_Cluster: chr [1:7776] "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" ...
..$ Partei : chr [1:7776] "FDP 1" "FDP 1" "FDP 1" "Die Mitte 2" ...
..$ m_w_Total : chr [1:7776] "Frauen" "Männer" "Total" "Frauen" ...
..$ Wert : num [1:7776] 0 1 1 0 1 1 NA NA NA 1 ...
$ 2021: tibble [7,776 × 10] (S3: tbl_df/tbl/data.frame)
..$ Kantons-Nr. : chr [1:7776] "1" "1" "1" "1" ...
..$ Kanton : chr [1:7776] "ZH" "ZH" "ZH" "ZH" ...
..$ Gemeinde-Nr. : num [1:7776] 230 230 230 230 230 230 230 230 230 230 ...
..$ Gemeinde : chr [1:7776] "Winterthur" "Winterthur" "Winterthur" "Winterthur" ...
..$ Wahljahr : num [1:7776] 2018 2018 2018 2018 2018 ...
..$ Einwohner : num [1:7776] 110912 110912 110912 110912 110912 ...
..$ Gemeindegrösse_Cluster: chr [1:7776] "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" ...
..$ Partei : chr [1:7776] "FDP 1" "FDP 1" "FDP 1" "Die Mitte 2" ...
..$ m_w_Total : chr [1:7776] "Frauen" "Männer" "Total" "Frauen" ...
..$ Wert : num [1:7776] 1 1 2 NA NA NA 0 1 1 2 ...
$ 2020: tibble [7,290 × 10] (S3: tbl_df/tbl/data.frame)
..$ Kantons-Nr. : chr [1:7290] "1" "1" "1" "1" ...
..$ Kanton : chr [1:7290] "ZH" "ZH" "ZH" "ZH" ...
..$ Gemeinde-Nr. : num [1:7290] 230 230 230 230 230 230 230 230 230 230 ...
..$ Gemeinde : chr [1:7290] "Winterthur" "Winterthur" "Winterthur" "Winterthur" ...
..$ Wahljahr : num [1:7290] 2018 2018 2018 2018 2018 ...
..$ Einwohner : num [1:7290] 110912 110912 110912 110912 110912 ...
..$ Gemeindegrösse_Cluster: chr [1:7290] "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" ...
..$ Partei : chr [1:7290] "FDP 1)" "FDP 1)" "FDP 1)" "CVP" ...
..$ m_w_Total : chr [1:7290] "Frauen" "Männer" "Total" "Frauen" ...
..$ Wert : num [1:7290] 1 1 2 0 1 1 2 1 3 NA ...
$ 2019: tibble [14,580 × 11] (S3: tbl_df/tbl/data.frame)
..$ Kantons-Nr. : chr [1:14580] "1" "1" "1" "1" ...
..$ Kanton : chr [1:14580] "ZH" "ZH" "ZH" "ZH" ...
..$ Gemeinde-Nr. : num [1:14580] 230 230 230 230 230 230 230 230 230 230 ...
..$ Gemeinde : chr [1:14580] "Winterthur" "Winterthur" "Winterthur" "Winterthur" ...
..$ Einwohner : num [1:14580] 111851 111851 111851 111851 111851 ...
..$ Grössenklasse-Nr. : chr [1:14580] "4" "4" "4" "4" ...
..$ Grössenklasse : chr [1:14580] "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" ...
..$ Gemeindegrösse_Cluster: chr [1:14580] "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" "≥ 100'000 Einwohnerinnen und Einwohner" ...
..$ Partei : chr [1:14580] "FDP 1)" "FDP 1)" "FDP 1)" "CVP" ...
..$ m_w_Total : chr [1:14580] "Frauen" "Männer" "Total" "Frauen" ...
..$ Wert : num [1:14580] 1 1 2 0 1 1 2 1 3 NA ...
Code anzeigen
lapply(daten_liste, summary)
$`2024`
Kantons-Nr. Kanton Gemeinde-Nr. Gemeinde
Length:7515 Length:7515 Min. : 2 Length:7515
Class :character Class :character 1st Qu.: 581 Class :character
Mode :character Mode :character Median :2769 Mode :character
Mean :2936
3rd Qu.:5113
Max. :6711
Wahljahr Einwohner Gemeindegrösse_Cluster Partei
Min. :2020 Min. : 4957 Length:7515 Length:7515
1st Qu.:2021 1st Qu.: 11680 Class :character Class :character
Median :2022 Median : 15763 Mode :character Mode :character
Mean :2022 Mean : 25286
3rd Qu.:2024 3rd Qu.: 22110
Max. :2024 Max. :423193
m_w_Total Wert
Length:7515 Min. : 0.00
Class :character 1st Qu.: 1.00
Mode :character Median : 1.00
Mean : 1.73
3rd Qu.: 2.00
Max. :30.00
NA's :4986
$`2023`
Kantons-Nr. Kanton Gemeinde-Nr. Gemeinde
Length:7776 Length:7776 Min. : 2 Length:7776
Class :character Class :character 1st Qu.: 546 Class :character
Mode :character Mode :character Median :2770 Mode :character
Mean :2952
3rd Qu.:5192
Max. :6711
Wahljahr Einwohner Gemeindegrösse_Cluster Partei
Min. :2020 Min. : 4957 Length:7776 Length:7776
1st Qu.:2020 1st Qu.: 12104 Class :character Class :character
Median :2021 Median : 15754 Mode :character Mode :character
Mean :2021 Mean : 25369
3rd Qu.:2022 3rd Qu.: 22193
Max. :2023 Max. :423193
m_w_Total Wert
Length:7776 Min. : 0.000
Class :character 1st Qu.: 1.000
Mode :character Median : 1.000
Mean : 1.719
3rd Qu.: 2.000
Max. :30.000
NA's :5316
$`2022`
Kantons-Nr. Kanton Gemeinde-Nr. Gemeinde
Length:7776 Length:7776 Min. : 2 Length:7776
Class :character Class :character 1st Qu.: 546 Class :character
Mode :character Mode :character Median :2770 Mode :character
Mean :2952
3rd Qu.:5192
Max. :6711
Wahljahr Einwohner Gemeindegrösse_Cluster Partei
Min. :2019 Min. : 4957 Length:7776 Length:7776
1st Qu.:2020 1st Qu.: 12104 Class :character Class :character
Median :2021 Median : 15754 Mode :character Mode :character
Mean :2021 Mean : 25353
3rd Qu.:2022 3rd Qu.: 22193
Max. :2022 Max. :423193
m_w_Total Wert
Length:7776 Min. : 0.000
Class :character 1st Qu.: 1.000
Mode :character Median : 1.000
Mean : 1.725
3rd Qu.: 2.000
Max. :30.000
NA's :5325
$`2021`
Kantons-Nr. Kanton Gemeinde-Nr. Gemeinde
Length:7776 Length:7776 Min. : 2 Length:7776
Class :character Class :character 1st Qu.: 546 Class :character
Mode :character Mode :character Median :2770 Mode :character
Mean :2952
3rd Qu.:5192
Max. :6711
Wahljahr Einwohner Gemeindegrösse_Cluster Partei
Min. :2017 Min. : 4994 Length:7776 Length:7776
1st Qu.:2018 1st Qu.: 12068 Class :character Class :character
Median :2020 Median : 15754 Mode :character Mode :character
Mean :2020 Mean : 25043
3rd Qu.:2021 3rd Qu.: 21718
Max. :2021 Max. :409241
m_w_Total Wert
Length:7776 Min. : 0.000
Class :character 1st Qu.: 1.000
Mode :character Median : 1.000
Mean : 1.722
3rd Qu.: 2.000
Max. :30.000
NA's :5316
$`2020`
Kantons-Nr. Kanton Gemeinde-Nr. Gemeinde
Length:7290 Length:7290 Min. : 2 Length:7290
Class :character Class :character 1st Qu.: 546 Class :character
Mode :character Mode :character Median :2770 Mode :character
Mean :2951
3rd Qu.:5192
Max. :6711
Wahljahr Einwohner Gemeindegrösse_Cluster Partei
Min. :2016 Min. : 4994 Length:7290 Length:7290
1st Qu.:2017 1st Qu.: 11572 Class :character Class :character
Median :2018 Median : 15710 Mode :character Mode :character
Mean :2018 Mean : 24871
3rd Qu.:2020 3rd Qu.: 21090
Max. :2020 Max. :409241
m_w_Total Wert
Length:7290 Min. : 0.000
Class :character 1st Qu.: 1.000
Mode :character Median : 1.000
Mean : 1.717
3rd Qu.: 2.000
Max. :30.000
NA's :4827
$`2019`
Kantons-Nr. Kanton Gemeinde-Nr. Gemeinde
Length:14580 Length:14580 Min. : 2 Length:14580
Class :character Class :character 1st Qu.: 546 Class :character
Mode :character Mode :character Median :2770 Mode :character
Mean :2951
3rd Qu.:5192
Max. :6711
Einwohner Grössenklasse-Nr. Grössenklasse Gemeindegrösse_Cluster
Min. : 4928 Length:14580 Length:14580 Length:14580
1st Qu.: 11733 Class :character Class :character Class :character
Median : 15693 Mode :character Mode :character Mode :character
Mean : 25006
3rd Qu.: 21506
Max. :415367
Partei m_w_Total Wert
Length:14580 Length:14580 Min. : 0.00
Class :character Class :character 1st Qu.: 0.00
Mode :character Mode :character Median : 0.00
Mean : 0.65
3rd Qu.: 1.00
Max. :30.00
NA's :8084
Code anzeigen
# Alle tibbles zu einem Dataframe zusammenfügenelec_gemeinde_exekutiven_combined <-bind_rows(daten_liste,.id ="Sheet") %>%select(-c('Grössenklasse-Nr.', Grössenklasse))datatable(elec_gemeinde_exekutiven_combined,class ='nowrap',filter ='top',options =list(pageLength =7,scrollX =TRUE,search =list(regex =TRUE,caseInsensitive =TRUE)))
# A tibble: 26 × 2
CantonAbbreviation CantonName
<chr> <chr>
1 VS Wallis
2 GE Genf
3 ZG Zug
4 ZH Zürich
5 FR Freiburg
6 BS Basel-Stadt
7 BE Bern
8 AG Aargau
9 VD Waadt
10 SZ Schwyz
# ℹ 16 more rows
3.4.2 Parteinamen
Die verschiedenen Quellen verwenden teils unteschiedliche Parteibezeichnungen. Zur Vereinheitlichung wird deshalb initial eine Lookup Tabelle gebildet.
Code anzeigen
# National- und Ständeratprint(lookup_elec_nr_sr_combined_parties_label %>%distinct(),n =3)
# A tibble: 20 × 7
party_orig_value short_name long_name prefix add_info level source
<chr> <chr> <chr> <chr> <lgl> <chr> <chr>
1 SVP SVP Schweizerische Volks… <NA> NA <NA> Natio…
2 FDP-Liberale FDP FDP.Die Liberalen <NA> NA <NA> Natio…
3 SP SP Sozialdemokratische … <NA> NA <NA> Natio…
# ℹ 17 more rows
# A tibble: 497 × 7
party_orig_value short_name long_name prefix add_info level source
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 p-fdp FDP <NA> p <NA> state Abstimmungen
2 p-sps SPS <NA> p <NA> state Abstimmungen
3 p-svp SVP <NA> p <NA> state Abstimmungen
# ℹ 494 more rows
Code anzeigen
# Alle Dataframes zu einem zusammenführen und Duplikate entfernenlookup_all_parties <-bind_rows( lookup_elec_nr_sr_combined_parties_label, lookup_kantonale_regierung_parties_label, lookup_gemeinde_exekutiven_parties_label, lookup_voting_parties_label)%>%distinct() %>%left_join(lookups_codebook_parties %>%select(short_name, Partei, Parteiname),by ="short_name") %>%select(Partei, Parteiname,everything())
4 Transformation & visualization
4.1 Abstimmungen
4.2 Parteilandschaft
4.2.1 Multi-Dimensions-Model
4.2.1.1 Minimalwerte
Für jede Partei den Minimalwert des Abstimmungsverhaltens zu verwenden, basiert auf der Zielsetzung, die klarste politische Position einer Partei in einem bestimmten Themenbereich zu identifizieren. Diese Methodik stellt sicher, dass auch bei wenigen Abweichungen von der Mehrheitslinie die tatsächliche Haltung der Partei deutlich erkennbar bleibt.
4.2.1.4 Hauptparteien: Durchschnittswerte als Zentrum und Min/Max als Ellipse / Verbände sowie Klein- und Regionalparteien nur mit ihrem Durchschnittswert